#pragma once
#include "RBTree.hpp"

namespace zty{
  template <class K, class V>
    class map{
      struct MapKofT{
        const K& operator()(const pair<K,V>& kv){
          return kv.first;
        }
      };
      typedef RBTree<K, pair<K,V>, MapKofT> RBT;
      RBT _rbt;

    public:
      typedef typename RBT::iterator iterator;
      typedef typename RBT::const_iterator const_iterator;

      iterator begin(){
        return _rbt.begin();
      }

      iterator end(){
        return _rbt.end();
      }

      pair<iterator, bool> Insert(const pair<K,V>& kv){
        return _rbt.Insert(kv);
      }

      V& operator[](const K& k){
        pair<iterator, bool> ret = Insert(make_pair(k, V()));
        return ret.first->second;
      }

      iterator Find(const K& k){
        return _rbt.Find(k);
      }

      void Inorder(){
        _rbt.Inorder();
      }
    };

}
